package com.lingyuan.oms.config;


import com.lingyuan.oms.constant.RabbitMqConstant;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName：RabbitMqPaymentOrderConfig
 * @Author: LeiHao
 * @Date: 2024/8/29 20:00
 * @Description: 支付订单延迟队列配置
 * @Version: 1.0
 */
@Configuration
public class RabbitMqPaymentOrderConfig {

    //=============================支付订单消息队列配置=====================================
    @Bean("paymentDeadQueue")
    public Queue createPaymentDeadQueue() {
        Map<String, Object> arguments = new HashMap<>();//队列自定义参数
        arguments.put("x-message-ttl", 120000);//消息过期时间
        arguments.put("x-dead-letter-exchange", RabbitMqConstant.EXCHANGE_PAYMENT_NAME);//消息过期后的转换机 -> 死信交换机
        arguments.put("x-dead-letter-routing-key", RabbitMqConstant.QUEUE_PAYMENT_RELEASE_NAME);//消息过期后的routeKey -> 死信路由
        return new Queue(RabbitMqConstant.QUEUE_PAYMENT_DEAD_NAME,
                true,//队列是否持久化。
                false, //是否为独占队列。
                false, //是否自动删除。
                arguments);
    }

    @Bean("paymentReleaseQueue")
    public Queue createPaymentReleaseQueue() {
        return new Queue(RabbitMqConstant.QUEUE_PAYMENT_RELEASE_NAME);
    }

    @Bean("paymentExchange")
    public Exchange createPaymentExchange() {
        return new DirectExchange(RabbitMqConstant.EXCHANGE_PAYMENT_NAME);
    }


    /**
     * 创建一个新的 Binding 对象。
     *
     * @param destination     目的地名称（通常是队列名）
     * @param destinationType 目的地类型（队列或交换器）
     * @param exchange        绑定到的交换器名称
     * @param routingKey      路由键
     * @param arguments       其他参数
     * @return 新创建的 Binding 对象
     */
    @Bean("paymentDeadBinding")
    public Binding createPaymentDeadBinding() {
        return new Binding(RabbitMqConstant.QUEUE_PAYMENT_DEAD_NAME,
                Binding.DestinationType.QUEUE,
                RabbitMqConstant.EXCHANGE_PAYMENT_NAME,
                RabbitMqConstant.QUEUE_PAYMENT_DEAD_NAME, null);
    }


    /**
     * 创建一个新的 Binding 对象。
     * @param destination     目的地名称（通常是队列名）
     * @param destinationType 目的地类型（队列或交换器）
     * @param exchange        绑定到的交换器名称
     * @param routingKey      路由键
     * @param arguments       其他参数
     * @return 新创建的 Binding 对象
     */
    @Bean("paymentReleaseBinding")
    public Binding createPaymentReleaseBinding() {
        return new Binding(RabbitMqConstant.QUEUE_PAYMENT_RELEASE_NAME,
                Binding.DestinationType.QUEUE,
                RabbitMqConstant.EXCHANGE_PAYMENT_NAME,
                RabbitMqConstant.QUEUE_PAYMENT_RELEASE_NAME, null);
    }


    //=============================生成订单消息队列配置=====================================


    @Bean("submitQueue")
    public Queue creatSubmitQueue(){
        return new Queue(RabbitMqConstant.QUEUE_SUBMIT_DEAD_NAME);
    }
    @Bean("submitExchange")
    public Exchange creatSubmitExchange(){
        return new DirectExchange(RabbitMqConstant.EXCHANGE_SUBMIT_NAME);
    }

    /**
     * 创建一个新的 Binding 对象。
     * @param destination 目的地名称（通常是队列名）
     * @param destinationType 目的地类型（队列或交换器）
     * @param exchange 绑定到的交换器名称
     * @param routingKey 路由键
     * @param arguments 其他参数
     * @return 新创建的 Binding 对象
     */
    @Bean("submitBinding")
    public Binding createSubmitBinding(){
        return new Binding(RabbitMqConstant.QUEUE_SUBMIT_DEAD_NAME,
                Binding.DestinationType.QUEUE,
                RabbitMqConstant.EXCHANGE_SUBMIT_NAME,
                RabbitMqConstant.QUEUE_SUBMIT_DEAD_NAME,
                null);
    }







}
